class RequestManager {
  constructor () {
    this.idMap = new Map()
  }

  /**
	 * 生成唯一ID，并将ID和请求信息存储到map对象中
	 * @param {string} method - 请求方法
	 * @param {string} url - 请求URL
	 * @param {object} params - 请求参数
	 * @returns {string|boolean} - 生成的唯一ID，如果存在相同请求则返回false
	 */
  generateId (method, url, params) {
    const id = this.generateUniqueId(method, url, params)
    if (this.idMap.has(id)) {
      return false
    }
    this.idMap.set(id, { method, url, params })
    return id
  }

  /**
	 * 根据ID删除map对象中的请求信息
	 * @param {string} id - 要删除的唯一ID
	 */
  deleteById (id) {
    this.idMap.delete(id)
  }

  /**
	 * 生成唯一ID的方法
	 * @param {string} method - 请求方法
	 * @param {string} url - 请求URL
	 * @param {object} params - 请求参数
	 * @returns {string} - 生成的唯一ID
	 */
  generateUniqueId (method, url, params) {
    const idString = `${method}-${url}-${this.serializeObject(params)}`
    let id = 0
    for (let i = 0; i < idString.length; i++) {
      id = ((id << 5) - id) + idString.charCodeAt(i)
      id |= 0
    }
    return id.toString()
  }

  /**
	 * 序列化对象为字符串
	 * @param {object} obj - 要序列化的对象
	 * @returns {string} - 序列化后的字符串
	 */
  serializeObject (obj) {
    const keys = Object.keys(obj).sort()
    const serializedObj = {}
    for (let key of keys) {
      const value = obj[key]
      if (value !== null && typeof value === 'object') {
        serializedObj[key] = this.serializeObject(value)
      } else {
        serializedObj[key] = value
      }
    }
    return JSON.stringify(serializedObj)
  }
}

export default RequestManager
